package com.xdb.sqlparser.ast.statement;

import com.xdb.sqlparser.ast.SQLDataType;
import com.xdb.sqlparser.ast.SQLExpr;
import com.xdb.sqlparser.ast.SQLName;
import com.xdb.sqlparser.ast.AbstractSQLObjectImpl;
import com.xdb.sqlparser.visitor.SQLAstVisitor;

import java.util.ArrayList;
import java.util.List;
/**
 * 这个类表示属性列
 * @author woate
 *
 */
public class SQLColumnDefinition extends AbstractSQLObjectImpl implements SQLTableElement {
	/**
	 * 属性列名称
	 */
	protected SQLName name;
	/**
	 * 属性列数据类型
	 */
	protected SQLDataType dataType;
	/**
	 * 默认值
	 */
	protected SQLExpr defaultExpr;
	/**
	 * 约束条件列表
	 */
	protected final List<SQLColumnConstraint> constraints = new ArrayList<SQLColumnConstraint>(0);
	/**
	 * 属性列注释
	 */
	protected SQLExpr comment;
	/**
	 * 是否启用约束
	 */
	protected Boolean enable;

	public SQLColumnDefinition() {

	}
	/**
	 * 是否启用约束
	 * @return
	 */
	public Boolean getEnable() {
		return enable;
	}
	/**
	 * 是否启用约束
	 * @param enable
	 */
	public void setEnable(Boolean enable) {
		this.enable = enable;
	}
	/**
	 * 属性列名称
	 * @return
	 */
	public SQLName getName() {
		return name;
	}
	/**
	 * 属性列名称
	 * @param name
	 */
	public void setName(SQLName name) {
		this.name = name;
	}
	/**
	 * 属性列数据类型
	 * @return
	 */
	public SQLDataType getDataType() {
		return dataType;
	}
	/**
	 * 属性列数据类型
	 * @param dataType
	 */
	public void setDataType(SQLDataType dataType) {
		this.dataType = dataType;
	}
	/**
	 * 默认值
	 * @return
	 */
	public SQLExpr getDefaultExpr() {
		return defaultExpr;
	}
	/**
	 * 默认值
	 * @param defaultExpr
	 */
	public void setDefaultExpr(SQLExpr defaultExpr) {
		if (defaultExpr != null) {
			defaultExpr.setParent(this);
		}
		this.defaultExpr = defaultExpr;
	}

	public List<SQLColumnConstraint> getConstraints() {
		return constraints;
	}

	@Override
	public void output(StringBuffer buf) {
		name.output(buf);
		buf.append(' ');
		this.dataType.output(buf);
		if (defaultExpr != null) {
			buf.append(" DEFAULT ");
			this.defaultExpr.output(buf);
		}
	}

	@Override
	protected void accept0(SQLAstVisitor visitor) {
		if (visitor.visit(this)) {
			this.acceptChild(visitor, name);
			this.acceptChild(visitor, dataType);
			this.acceptChild(visitor, defaultExpr);
			this.acceptChild(visitor, constraints);
		}
		visitor.endVisit(this);
	}
	/**
	 * 属性列注释
	 * @return
	 */
	public SQLExpr getComment() {
		return comment;
	}
	/**
	 * 属性列注释
	 * @param comment
	 */
	public void setComment(SQLExpr comment) {
		this.comment = comment;
	}

}
